#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2024/12/30 22:07
# @Author : George
"""
使用asyncio.create_task()可以将一个协程对象包装成为任务，这个任务会自动调度运行，
简单的说就是asyncio.create_task()，可以往事件循环里面提交任务

事件循环可以并发执行任务列表里面的任务，一个任务遇到IO之后，自动切换到另外一个任务

----------
前面说过await后面是协程对象，会直接去执行这个协程函数，如果协程函数里面有异步的IO,则会自动切换
await task对象，不是直接去执行它，而是切换到其它任务。这个任务已经添加到事件循环了，asyncio会自动调度执行

过程：
任务1 - 任务2 - 任务1.f1 - 任务2.f1 - 任务1.f1进入Io,任务2.f1进入IO-任务1.f1Io结束-任务2.f1Io结束
- 任务1结束- 任务2结束

task的意义：
帮助我们往事件循环里面提交任务
"""

import asyncio


async def f1(name):
    print(name, "进入IO")
    await asyncio.sleep(3)
    print(name, "结束IO")
    return 42


async def main(name):
    print(name, "start")
    # 这个task对象就是对于协程对象的包装
    task = asyncio.create_task(f1(name))  # 只是添加任务，并不会阻塞
    print(task)  # <Task pending coro=<f1() running at D:\PythonData\pythonProject\reptile\异步IO\asyncio_task.py:23>>
    # task.cancel()  # 可以取消task让其不被执行
    res = await task
    print(res)


asyncio.run(asyncio.wait([main("任务1"), main("任务2")]))
